package net.maku.sms;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import net.maku.sms.config.SmsConfig;
import org.apache.commons.codec.digest.DigestUtils;


import java.util.HashMap;
import java.util.Map;

/**
 * @author lvpb
 * @version 1.0.0
 * @date 2024/7/12 0:49
 * @description TianYiSmsStrategy
 */
public class TianYiSmsStrategy implements SmsStrategy {

    private static final String SMS_API = "/api/sms/air/send";

    private final SmsConfig smsConfig;

    public TianYiSmsStrategy(SmsConfig smsConfig) {
        this.smsConfig = smsConfig;


    }


    /**
     * 发送短信
     *
     * @param mobile 手机号
     * @param params 参数
     */
    @Override
    public void send(String mobile, Map<String, String> params) {

        tianYiSmsSend(mobile, params);

    }

    /**
     * 发送短信
     *
     * @param mobile     手机号
     * @param params     模板参数
     */
    public void tianYiSmsSend(String mobile, Map<String, String> params) {
        // 构造请求URL
        String url = smsConfig.getUrl() + SMS_API;

        // 构建请求体
        Map<String, Object> body = new HashMap<>();
        body.put("appKey", StrUtil.emptyIfNull(smsConfig.getAccessKey()));
        body.put("timestamp", System.currentTimeMillis());
        body.put("mobile", StrUtil.emptyIfNull(mobile));
        body.put("spNumber", "");
        body.put("sendTime", "");
        body.put("reportUrl", "");
        body.put("attach", "");

        // 根据模板ID生成内容
        String content = generateContent(params);
        body.put("content", StrUtil.emptyIfNull(content));

        // 计算签名
        String sign = calculateSign(body, smsConfig.getSecretKey());
        body.put("sign", StrUtil.emptyIfNull(sign));

        // 转换请求体为JSON字符串
        String bodyJson = JSONUtil.toJsonStr(body);

        // 使用Hutool发送POST请求
        String respContent;
        try (HttpResponse response = HttpRequest.post(url)
                .header("Content-Type", "application/json; charset=UTF-8")
                .body(bodyJson)
                .execute()) {

            // 获取响应内容
            respContent = response.body();
        }
        System.out.println("响应内容：" + respContent);
    }

    /**
     * 根据模板ID和参数生成短信内容
     *
     * @param params     参数
     * @return 短信内容
     */
    private String generateContent( Map<String, String> params) {
        return switch (params.get("templateId")) {
            case "A" -> {
                String daysText = params.get("days");
                if ("0".equals(daysText)) {
                    yield String.format("【疏附县招商慧链项目管理平台】\n现有%s公司（个人）已提报%s项目资料，需贵单位协助企业（个人）办理%s手续，请尽快完成办结！\n企业（个人）联系方式:%s，电话号码:%s",
                            params.get("companyName"), params.get("projectName"), params.get("procedure"), params.get("contact"), params.get("contactMobile"));
                } else {
                    yield String.format("【疏附县招商慧链项目管理平台】\n现有%s公司（个人）已提报%s项目资料，需贵单位协助企业（个人）办理%s手续，请于%s个工作日内完成办结！\n企业（个人）联系方式:%s，电话号码:%s",
                            params.get("companyName"), params.get("projectName"), params.get("procedure"), params.get("days"), params.get("contact"), params.get("contactMobile"));
                }
            }
            case "B" -> String.format("【疏附县招商慧链项目管理平台】\n现有%s公司（个人）已提报%s项目资料，需贵单位协助企业（个人）办理%s手续，请安排专人予以处理！\n企业（个人）联系方式:%s，电话号码:%s",
                    params.get("companyName"), params.get("projectName"), params.get("procedure"), params.get("contact"), params.get("contactMobile"));
            case "C" -> String.format("【疏附县招商慧链项目管理平台】\n现有%s公司（个人）已向%s单位提报%s项目资料，需要办理%s手续，请您关注并协调！\n企业（个人）联系方式:%s，电话号码:%s",
                    params.get("companyName"), params.get("department"), params.get("projectName"), params.get("procedure"), params.get("contact"), params.get("contactMobile"));
            case "D" -> String.format("【疏附县招商慧链项目管理平台】\n现有%s公司（个人）已于%s日前向%s单位提报%s项目资料，用于办理%s手续，截止目前仍未办结，逾期%s日，请您予以协调处理！\n企业（个人）联系方式:%s，电话号码:%s",
                    params.get("companyName"), params.get("days"), params.get("department"), params.get("projectName"), params.get("procedure"), params.get("overdueDays"), params.get("contact"), params.get("contactMobile"));
            case "E" -> String.format("【疏附县招商慧链项目管理平台】\n现有%s项目，编号为%s,本周进度为%s，请及时跟进。 企业（个人）联系方式:%s，电话:%s",
                    params.get("projectName"), params.get("projectCode"), params.get("weeklyProgress"), params.get("contact"), params.get("contactMobile"));
            default -> throw new IllegalArgumentException("未知的模板ID：" + params.get("templateId"));
        };
    }

    /**
     * 根据请求体和密钥计算签名
     *
     * @param body   请求体
     * @param secret 密钥
     * @return 签名
     */
    private String calculateSign(Map<String, Object> body, String secret) {
        String sb = (String) body.get("appKey") +
                body.get("timestamp") +
                body.get("mobile") +
                body.get("content") +
                body.get("spNumber") +
                body.get("sendTime") +
                secret; // 添加密钥到末尾

        // 使用MD5算法生成签名
        return DigestUtils.md5Hex(sb);
    }
}
